import requests
from bs4 import BeautifulSoup
import re
from requests.packages import urllib3
import pymysql

# 关闭告警信息
urllib3.disable_warnings()
# 连接数据库
conn = pymysql.connect(
    host="127.0.0.1",
    port=3306,  # 端口号
    user="root",  # 数据库用户
    password="123456",  # 数据库密码
    database="pachong"  # 要连接的数据库名称
)
# 创建游标
cursor = conn.cursor()

# url = 'https://mooc1-1.chaoxing.com/course/211285091.html'  # 超星
url = 'https://www.gdit.edu.cn/xmsbwz/2019ngdsgzyxgspzyqjszl/'  # 学校网站
# headers = {
#     'Connection': 'Keep-Alive',
#     'Accept': 'text/html,application/xhtml+xml, */*',
#     'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
#     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (HTML, '
#                   'like Gecko) Chrome/87.0.4280.88 Safari/537.36'
# }
def spiderData():
    # 编写sql语句
    headline_sqlinsert = "insert into headline_table(headline_id,headline_name,headline_url) values(%s,%s,%s)"
    content_sqlinsert = "insert into content_table(headline_id,content_name,content_url) values(%s,%s,%s)"
    strHtml = requests.get(url=url, verify=False)  # Get方式获取网页数据
    strHtml.encoding = 'utf-8'
    soup = BeautifulSoup(strHtml.text, 'lxml')
    data = soup.find_all('div', class_='list-group')
    # 查了资料才清楚一个概念，叫做捕获分组。
    # 简单说，就是正则表示式里出现括号的时候，括号里的内容匹配到的部分是会被作为结果输出的
    # 而不是把整个正则表达式匹配到的内容作为结果输出。
    # 那怎么得到想要的结果呢？在Python里，当一个分组的头部出现"?:"时，表示这是一个非捕获分组
    # 意思就是它只是正常参与匹配过程，但不作为独立的结果进行输出。
    url_pattern = re.compile(r'\"http(?:.*?)\"')
    title_pattern = re.compile(r'.*?([\u4E00-\u9FA5]+).*?')
    num = 0
    for item in data:
        title_match = re.findall(title_pattern, str(item))
        url_match = re.findall(url_pattern, str(item))
        if (not title_match) or (not url_match):
            return 'ERROR'
        num += 1
        z = list(zip(title_match, url_match))  # 两个数组合并成一个二维数组
        for i, t in enumerate(z):
            if i == 0:
                content = (num, t[0], t[1].strip("\""))
                cursor.executemany(headline_sqlinsert, [content]) # content的内容是content=(***,***,****)，content的数据要与sql语句中的占位符数量相等
            else:
                content = (num, t[0], t[1].strip("\""))
                cursor.executemany(content_sqlinsert, [content]) # content的内容是content=(***,***,****)，content的数据要与sql语句中的占位符数量相等
    conn.commit()  # 提交请求，不然不会插入数据
    print("插入完成")
    return 'OK'
